iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1

正式開啟『 優雅的 Ruby 』的學習模式!

上回提到我們要用這本書來快樂學習,
透過重構的技巧進行修改、維護我們的程式碼。

什麼是重構(Refactoring)?

重構是指對軟體代碼進行更動以增加可讀性或者簡化結構,但是不影響功能和輸出結果。
重點來了,

進行重構前必須先完成程式語言。

所以;你需要先學好如何把你的每段 Code 依照邏輯、根據、方法呈現等『方法』 進行整理,
才能執行重構。

方法,做什麼方法、都是有目的!

最常用以下四種的歸類方法:

輸入處理 (collecting input);

功能實現 (performing work);

輸出處理 (delivering output);

失敗處理 (handling failures);

其他方法如診斷(diagnostics)、清理(cleanup),為特殊背景下使用,但請先記住。(未來文章介紹)

看著 Code ,舉例來說:

(此段模擬於 Ruby 一書經典範例)

def location(item, value)
    sub_ttile = get_sub_ttile(item, value)
    if(sub_ttile.length==0)
        raise BobArticle::AnalysisError, "The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"
    else
        first_row = sub_table[0]
        case item
        when :class
          BobArticle::Location.get(first_row.file_path, first_row.class_name,nil)
        when :method
          BobArticle::Location.get(first_row.file_path, first_row.class_name, first_row.method_name)
        when :file
          BobArticle::Location.get(first_row.file_path, fnil, nil)
        else
          raise ArgumentError, "Item must be :class, :method, or :file"
        end
    end  
end

這裡不急探討這code的目的是什麼,先套入上述四個歸類方法進行拆分,
先學會分析、歸類再與結果呈現進行比對。

首先;
這是取得『輸入』:

sub_ttile = get_sub_ttile(item,value)

若發生錯誤、數據不存在時,則拋出異常:

if(sub_ttile.length==0)
        raise BobArticle::AnalysisError,"The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"

若數據在,則直接獲取數據:

 else
        first_row = sub_table[0]

該方法的核心功能:

case item
        when :class
          BobArticle::Location.get(first_row.file_path,first_row.class_name,nil)
        when :method
          BobArticle::Location.get(first_row.file_path,first_row.class_name,first_row.method_name)
        when :file
          BobArticle::Location.get(first_row.file_path,fnil,nil)

最後的失敗處理:

else
          raise ArgumentError,"Item must be :class, :method, or :file"

比照最初;

def location(item,value)
    sub_ttile = get_sub_ttile(item,value)  #輸入處理
    --------------------------------------------------
    if(sub_ttile.length==0)
       、、、 
    else                                   #失敗處理
    --------------------------------------------------
        first_row = sub_table[0]
        case item
        when :class
          、、、
        when :method
          、、、
        when :file
          、、、                            #功能實現
    --------------------------------------------------      
        else
          、、、
        end
    end  
end

不夠自信、不夠優雅的程式碼是難以重構跟優化的。

上述表達衍生出的問題就是:

  1. else (第6行) end (第20行) 變成是異常處理。表示如果沒有異常的情下,這段 if 的程式碼外層的 else、 end 是沒有意義的。

  2. 功能分類相雜,雖有輸入處理、失敗處理、功能實現、異常處理但不同部分參雜一起容易模糊重點分析。

Code 經營處理,避免造成閱讀上不必要的負擔。

練習使用歸納方式整理程式碼,如同我們在栽植一樣的細心呵護~
讓我們重新整理順序:

  1. 內容分明(把不要的語贅詞省略、替換)。
  2. 有要求的把方法功能呈現,並進行排序整理。
  3. 處理輸入,實現核心功能,然後處理輸出,最後若有需要再進行異常的處理。
    這樣的順序方法是為了善用『重構』變成一個更好『故事』表達。

學習優雅的Ruby 是為了讓我們更有自信的寫出優雅的代碼。

易於理解和維護、更少的bug 且能更靈活的適應需求變化,找回初衷。

好的故事表達帶你上天堂,
越能符合語意的目的,表示我們離資優生筆記更近一點!

那今天就先學習到這,
但務必牢記四個歸類方法,不論是今後鐵人文章用還是永久的學習!
我們絕對都會經常不斷地重複使用到、甚至當作練習的基礎。
/images/emoticon/emoticon69.gif


上一篇
做人如果沒夢想,跟鹹魚有什麼區別!
下一篇
方法的輸入處理,其實不簡單!
系列文
寫出優雅的 Ruby ! (衡量自我學習時間,轉為雞湯系列再出發! )4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chen_
iT邦新手 5 級 ‧ 2021-09-08 01:02:36

您好,想請問這段

def location(item, value)
    sub_ttile = get_sub_ttile(item, value)
    if(sub_ttile.length==0)
        raise BobArticle::AnalysisError, "The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"
    else
        first_row = sub_table[0]
        case item
        when :class
          BobArticle::Location.get(first_row.file_path, first_row.class_name,nil)
        when :method
          BobArticle::Location.get(first_row.file_path, first_row.class_name, first_row.method_name)
        when :file
          BobArticle::Location.get(first_row.file_path, fnil, nil)
        else
          raise ArgumentError, "Item must be :class, :method, or :file"
        end
    end  
end

重構完會是什麼樣子呢?

您好!
謝謝您的發問,
這部分後面的章節會再次提到與方法介紹唷~
或是也可以從『 優雅的 Ruby 』 一書找到許多推薦方法:)

我要留言

立即登入留言